//
// Created by work on 24-11-27.
//

#include <iot_model_device/device_model_mgr/CProtocolMgr.h>

bool CProtocolMgr::getModbusMaps(const std::string &userid, const std::string &model_name, Json::Value &modbusMaps) {
    return CSsqlMgr::ins().getModbusMaps(userid, model_name, modbusMaps);
}

bool CProtocolMgr::addModbusMap(Json::Value &map) {
    return CSsqlMgr::ins().addModbusMap(map);
}

bool CProtocolMgr::delModbusMap(const std::string &map_id) {
    return CSsqlMgr::ins().delModbusMap(map_id);
}

bool CProtocolMgr::getModbusMapYxs(const std::string &map_id, std::string &userid, std::string &model_name, Json::Value &mapsigs) {
    std::vector<CRtModelYxInfo> yxs;
    if(!CModelMgr::ins().getRtModelYxs(userid, model_name, yxs)) {
        return false;
    }

    Json::Value yxarrs(Json::arrayValue);
    for(const auto& yx : yxs) {
        Json::Value jsonyx;
        jsonyx["name"] = yx.name;
        jsonyx["descr"] = yx.descr;
        jsonyx["grouping"] = yx.grouping;
        yxarrs.append(jsonyx);
    }
    mapsigs["mapsigs"] = yxarrs;
    mapsigs["userid"] = userid;
    mapsigs["model_name"] = model_name;
    mapsigs["map_id"] = map_id;

    return CSsqlMgr::ins().getModbusMapYxs(map_id, mapsigs);
}

bool CProtocolMgr::changeModbusMapYxs(const std::string &map_id,Json::Value &mapsigs, Json::Value &errorino) {
    Json::Value addarrs(Json::arrayValue);
    Json::Value changearrs(Json::arrayValue);
    Json::Value deletearrs(Json::arrayValue);
    Json::Value selectarrs(Json::arrayValue);
    for(auto& item : mapsigs) {
        std::string opt = item["opt"].asString();
        if(opt == "opt_add") {
            addarrs.append(item);
        } else if(opt == "opt_delete") {
            deletearrs.append(item);
        } else if(opt == "opt_change") {
            changearrs.append(item);
        } else {
            selectarrs.append(item);
        }
    }

    errorino["opt_select"] = true;

    if(addarrs.size() > 0) {
        errorino["opt_add"] = true;
        if(!CSsqlMgr::ins().addModbusMapYxs(map_id, addarrs)) {
            errorino["opt_add"] = false;
        }
    }

    if(changearrs.size() > 0) {
        errorino["opt_change"] = true;
        if(!CSsqlMgr::ins().changeModbusMapYxs(map_id, changearrs)) {
            errorino["opt_change"] = false;
        }
    }

    if(deletearrs.size() > 0) {
        if(!CSsqlMgr::ins().deleteModbusMapYxs(map_id, deletearrs)) {
            errorino["opt_delete"] = false;
        }
    }
    return true;
}

bool CProtocolMgr::getModbusMapYcs(const std::string &map_id,std::string &userid, std::string &model_name, Json::Value &mapsigs) {
    std::vector<CRtModelYcInfo> ycs;
    if(!CModelMgr::ins().getRtModelYcs(userid, model_name, ycs)) {
        return false;
    }

    Json::Value ycarrs(Json::arrayValue);
    for(const auto& yc : ycs) {
        Json::Value jsonyc;
        jsonyc["name"] = yc.name;
        jsonyc["descr"] = yc.descr;
        jsonyc["grouping"] = yc.grouping;
        ycarrs.append(jsonyc);
    }
    mapsigs["mapsigs"] = ycarrs;
    mapsigs["userid"] = userid;
    mapsigs["model_name"] = model_name;
    mapsigs["map_id"] = map_id;

    return CSsqlMgr::ins().getModbusMapYcs(map_id, mapsigs);
}

bool CProtocolMgr::changeModbusMapYcs(const std::string &map_id, Json::Value &mapsigs, Json::Value &errorino) {
    Json::Value addarrs(Json::arrayValue);
    Json::Value changearrs(Json::arrayValue);
    Json::Value deletearrs(Json::arrayValue);
    Json::Value selectarrs(Json::arrayValue);
    for(auto& item : mapsigs) {
        std::string opt = item["opt"].asString();
        if(opt == "opt_add") {
            addarrs.append(item);
        } else if(opt == "opt_delete") {
            deletearrs.append(item);
        } else if(opt == "opt_change") {
            changearrs.append(item);
        } else {
            selectarrs.append(item);
        }
    }

    if(addarrs.size() > 0) {
        errorino["opt_add"] = true;
        if(!CSsqlMgr::ins().addModbusMapYcs(map_id, addarrs)) {
            errorino["opt_add"] = false;
        }
    }

    if(changearrs.size() > 0) {
        errorino["opt_change"] = true;
        if(!CSsqlMgr::ins().changeModbusMapYcs(map_id, changearrs)) {
            errorino["opt_change"] = false;
        }
    }

    if(deletearrs.size() > 0) {
        if(!CSsqlMgr::ins().deleteModbusMapYcs(map_id, deletearrs)) {
            errorino["opt_delete"] = false;
        }
    }
    return true;
}

bool CProtocolMgr::getModbusMapYks(const std::string &map_id, std::string &userid,  std::string &model_name, Json::Value &mapsigs) {
    std::vector<CRtModelYkInfo> yks;
    if(!CModelMgr::ins().getRtModelYks(userid, model_name, yks)) {
        return false;
    }

    Json::Value ykarrs(Json::arrayValue);
    for(const auto& yk : yks) {
        Json::Value jsonyk;
        jsonyk["name"] = yk.name;
        jsonyk["descr"] = yk.descr;
        jsonyk["grouping"] = yk.grouping;
        ykarrs.append(jsonyk);
    }
    mapsigs["mapsigs"] = ykarrs;
    mapsigs["userid"] = userid;
    mapsigs["model_name"] = model_name;
    mapsigs["map_id"] = map_id;

    return CSsqlMgr::ins().getModbusMapYks(map_id, mapsigs);
}

bool CProtocolMgr::changeModbusMapYks(const std::string &map_id, Json::Value &mapsigs, Json::Value &errorino) {
    Json::Value addarrs(Json::arrayValue);
    Json::Value changearrs(Json::arrayValue);
    Json::Value deletearrs(Json::arrayValue);
    Json::Value selectarrs(Json::arrayValue);
    for(auto& item : mapsigs) {
        std::string opt = item["opt"].asString();
        if(opt == "opt_add") {
            addarrs.append(item);
        } else if(opt == "opt_delete") {
            deletearrs.append(item);
        } else if(opt == "opt_change") {
            changearrs.append(item);
        } else {
            selectarrs.append(item);
        }
    }

    if(addarrs.size() > 0) {
        errorino["opt_add"] = true;
        if(!CSsqlMgr::ins().addModbusMapYks(map_id, addarrs)) {
            errorino["opt_add"] = false;
        }
    }

    if(changearrs.size() > 0) {
        errorino["opt_change"] = true;
        if(!CSsqlMgr::ins().changeModbusMapYks(map_id, changearrs)) {
            errorino["opt_change"] = false;
        }
    }

    if(deletearrs.size() > 0) {
        if(!CSsqlMgr::ins().deleteModbusMapYks(map_id, deletearrs)) {
            errorino["opt_delete"] = false;
        }
    }
    return true;
}

bool CProtocolMgr::getModbusMapParameters(const std::string &map_id, std::string &userid,  std::string &model_name, Json::Value &mapsigs) {
    std::vector<CRtModelParameterInfo> parameters;
    if(!CModelMgr::ins().getRtModelParameters(userid, model_name, parameters)) {
        return false;
    }

    Json::Value parameterarrs(Json::arrayValue);
    for(const auto& parameter : parameters) {
        Json::Value jsonparameter;
        jsonparameter["name"] = parameter.name;
        jsonparameter["descr"] = parameter.descr;
        jsonparameter["grouping"] = parameter.grouping;
        parameterarrs.append(jsonparameter);
    }
    mapsigs["mapsigs"] = parameterarrs;
    mapsigs["userid"] = userid;
    mapsigs["model_name"] = model_name;
    mapsigs["map_id"] = map_id;

    return CSsqlMgr::ins().getModbusMapParameters(map_id, mapsigs);
}

bool CProtocolMgr::changeModbusMapParameters(const std::string &map_id, Json::Value &mapsigs, Json::Value &errorino) {
    Json::Value addarrs(Json::arrayValue);
    Json::Value changearrs(Json::arrayValue);
    Json::Value deletearrs(Json::arrayValue);
    Json::Value selectarrs(Json::arrayValue);
    for(auto& item : mapsigs) {
        std::string opt = item["opt"].asString();
        if(opt == "opt_add") {
            addarrs.append(item);
        } else if(opt == "opt_delete") {
            deletearrs.append(item);
        } else if(opt == "opt_change") {
            changearrs.append(item);
        } else {
            selectarrs.append(item);
        }
    }

    if(addarrs.size() > 0) {
        errorino["opt_add"] = true;
        if(!CSsqlMgr::ins().addModbusMapParameters(map_id, addarrs)) {
            errorino["opt_add"] = false;
        }
    }

    if(changearrs.size() > 0) {
        errorino["opt_change"] = true;
        if(!CSsqlMgr::ins().changeModbusMapParameters(map_id, changearrs)) {
            errorino["opt_change"] = false;
        }
    }

    if(deletearrs.size() > 0) {
        if(!CSsqlMgr::ins().deleteModbusMapParameters(map_id, deletearrs)) {
            errorino["opt_delete"] = false;
        }
    }
    return true;
}
